闲扯
话说分块的复杂度不是 $O(n\sqrt{n})$ 吗,为毛开 $O2$ 分块跑的比我的线段树快。。。
Solution
解法一:线段树
这个区间翻转可以看成是对每个数异或一下。
所以对每个区间,如果翻转了一次,它的贡献就变成了 $len-ans$ 。
线段树维护区间内 $1$ 的总数,懒标记改为异或即可。
解法二:分块
先将整个序列分为 $\sqrt{n}$ 块,按照分块大段维护,局部朴素的思想,我们按照如下方式进行修改和查询。
修改:
记录一个 $inv$ 数组,表示这个区间被翻转了几次。
对于大段的区间,我们直接将 $ans$ 变为 $sz-ans$ ,其中 $sz$ 为块的大小。
对于开头和末尾部分,暴力维护。
先判断当前位置的数翻转了 $inv$ 次之后是否为 $1$ ,如果是,就将该段的答案减 $1$ ,否则就加 $1$ 。
查询:
对于大的区间,我们直接调用答案。
对于开头和末尾部分,暴力维护,具体方法和修改类似。
Code
1 |
|